import articlesAPI from '@/api/helpCenter/articles'
import { throwErrorMessage } from '@/store/utils/api'

import types from '../../mutation-types'
export const actions = {
  index: async (
    { commit },
    { pageNumber, portalSlug, locale, status, author_id, category_slug }
  ) => {
    try {
      commit(types.SET_UI_FLAG, { isFetching: true })
      const {
        data: { payload, meta },
      } = await articlesAPI.getArticles({
        pageNumber,
        portalSlug,
        locale,
        status,
        author_id,
        category_slug,
      })
      const articleIds = payload.map(article => article.id)
      commit(types.CLEAR_ARTICLES)
      commit(types.ADD_MANY_ARTICLES, payload)
      commit(types.SET_ARTICLES_META, meta)
      commit(types.ADD_MANY_ARTICLES_ID, articleIds)
      return articleIds
    } catch (error) {
      return throwErrorMessage(error)
    } finally {
      commit(types.SET_UI_FLAG, { isFetching: false })
    }
  },

  create: async ({ commit, dispatch }, { portalSlug, ...articleObj }) => {
    commit(types.SET_UI_FLAG, { isCreating: true })
    try {
      const {
        data: { payload },
      } = await articlesAPI.createArticle({
        portalSlug,
        articleObj,
      })
      const { id: articleId } = payload
      commit(types.ADD_ARTICLE, payload)
      commit(types.ADD_ARTICLE_ID, articleId)
      commit(types.ADD_ARTICLE_FLAG, articleId)
      dispatch('portals/updatePortal', portalSlug, { root: true })
      return articleId
    } catch (error) {
      return throwErrorMessage(error)
    } finally {
      commit(types.SET_UI_FLAG, { isCreating: false })
    }
  },

  show: async ({ commit }, { id, portalSlug }) => {
    commit(types.SET_UI_FLAG, { isFetching: true })
    try {
      const response = await articlesAPI.getArticle({ id, portalSlug })
      const {
        data: { payload },
      } = response
      const { id: articleId } = payload
      commit(types.ADD_ARTICLE, payload)
      commit(types.ADD_ARTICLE_ID, articleId)
      commit(types.SET_UI_FLAG, { isFetching: false })
    } catch (error) {
      commit(types.SET_UI_FLAG, { isFetching: false })
    }
  },
  update: async ({ commit }, { portalSlug, articleId, ...articleObj }) => {
    commit(types.UPDATE_ARTICLE_FLAG, {
      uiFlags: {
        isUpdating: true,
      },
      articleId,
    })

    try {
      const {
        data: { payload },
      } = await articlesAPI.updateArticle({
        portalSlug,
        articleId,
        articleObj,
      })

      commit(types.UPDATE_ARTICLE, payload)

      return articleId
    } catch (error) {
      return throwErrorMessage(error)
    } finally {
      commit(types.UPDATE_ARTICLE_FLAG, {
        uiFlags: {
          isUpdating: false,
        },
        articleId,
      })
    }
  },
  delete: async ({ commit }, { portalSlug, articleId }) => {
    commit(types.UPDATE_ARTICLE_FLAG, {
      uiFlags: {
        isDeleting: true,
      },
      articleId,
    })
    try {
      await articlesAPI.deleteArticle({ portalSlug, articleId })
      commit(types.REMOVE_ARTICLE, articleId)
      commit(types.REMOVE_ARTICLE_ID, articleId)
      return articleId
    } catch (error) {
      return throwErrorMessage(error)
    } finally {
      commit(types.UPDATE_ARTICLE_FLAG, {
        uiFlags: {
          isDeleting: false,
        },
        articleId,
      })
    }
  },
}
